import { createAlova } from 'alova';
import VueHook from 'alova/vue';
import { xhrRequestAdapter } from '@alova/adapter-xhr';
import { Book } from '../models/Book';

// 创建alova实例
const alovaInstance = createAlova({
  baseURL: '/api',
  statesHook: VueHook,
  requestAdapter: xhrRequestAdapter(),  responded: {
    onSuccess: response => {
      const responseData = response.data;
      
      if (responseData && responseData.code === 200) {
        return responseData.data;
      }
      
      // 后端返回的错误
      throw new Error(responseData?.message || '请求失败');
    },
    onError: error => {
      console.error('API请求错误:', error);
      throw error;
    }
  }
});

/**
 * 图书服务类 - 提供所有与图书相关的API调用
 */
export const BookService = {
  /**
   * 根据ISBN获取图书信息
   * @param {string} isbn - 图书ISBN号
   * @returns {Promise<Book>} 图书信息
   */  getBookByIsbn(isbn) {
    return alovaInstance.Get(`/books/${isbn}`).then(data => {
      return Book.fromApiResponse(data);
    });
  },

  /**
   * 根据书名搜索图书
   * @param {string} title - 书名关键字
   * @returns {Promise<Array<Book>>} 图书列表
   */
  searchByTitle(title) {
    return alovaInstance.Get('/books/search/title', {
      params: { title }
    }).then(data => {
      return Book.fromApiResponseArray(data);
    });
  },

  /**
   * 根据作者搜索图书
   * @param {string} author - 作者关键字
   * @returns {Promise<Array<Book>>} 图书列表
   */
  searchByAuthor(author) {
    return alovaInstance.Get('/books/search/author', {
      params: { author }
    }).then(data => {
      return Book.fromApiResponseArray(data);
    });
  },

  /**
   * 多条件分页搜索图书
   * @param {Object} params - 搜索参数
   * @param {number} params.page - 页码，默认为1
   * @param {number} params.size - 每页大小，默认为10
   * @param {string} [params.title] - 书名关键字，可选
   * @param {string} [params.author] - 作者关键字，可选
   * @param {string} [params.publisher] - 出版社关键字，可选
   * @returns {Promise<Object>} 分页结果
   */
  searchBooks(params = {}) {
    const defaultParams = {
      page: 1,
      size: 10
    };
    
    const searchParams = { ...defaultParams, ...params };
    
    // 移除空参数
    Object.keys(searchParams).forEach(key => {
      if (searchParams[key] === '' || searchParams[key] === undefined || searchParams[key] === null) {
        delete searchParams[key];
      }
    });

    return alovaInstance.Get('/books/search', {
      params: searchParams
    }).then(data => {
      return {
        ...data,
        records: Book.fromApiResponseArray(data.records)
      };
    });
  },
  /**
   * 使用全文索引搜索图书，支持分页
   * @param {Object} params - 搜索参数
   * @param {string} params.keyword - 搜索关键词
   * @param {number} params.page - 页码，默认为1
   * @param {number} params.size - 每页大小，默认为10
   * @returns {Promise<Object>} 分页结果
   */
  searchByFullText(params = {}) {
    const defaultParams = {
      page: 1,
      size: 10
    };
    
    // 确保 keyword 参数存在
    if (!params.keyword) {
      return Promise.reject(new Error('搜索关键词不能为空'));
    }
    
    const searchParams = { ...defaultParams, ...params };
    
    return alovaInstance.Get('/books/search/fulltext', {
      params: searchParams
    }).then(data => {
      return {
        ...data,
        records: Book.fromApiResponseArray(data.records)
      };
    });
  }
};

export default alovaInstance;
